package br.com.tcc.gp.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.tcc.gp.controlador.ControleEndereco;
import br.com.tcc.gp.modelo.Endereco;
import br.com.tcc.gp.modelo.Pessoa;
import br.com.tcc.gp.util.DBConnector;

public class PessoaDAO {

	private int linhas;
	private List<Pessoa> lista;
	private Connection conexao;
	private PreparedStatement preparedStatement;

	public static final String TABELA = "pessoa";
	public static final String ID = "codigo";
	public static final String NOME = "nome";
	public static final String SEXO = "sexo";
	public static final String CPF = "cpf";
	public static final String RG = "rg";
	public static final String ENDERECO = "endereco";

	public static final String ID_ENDERECO = "id_endereco";
	public static final String SEQUENCIA = "seq_pessoa";

	public PessoaDAO() {
		try {
			conexao = DBConnector.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("Conexao Falho");
		}
		lista = new ArrayList<Pessoa>();
	}
	
	public int salvar(Pessoa pessoa)  {		
		try {			
			 String sql ="INSERT INTO pessoa (codigo, nome, sexo, cpf, rg, id_endereco) VALUES ("+SEQUENCIA+".nextval, ? , ? , ? , ? , ? )";			
			 preparedStatement = conexao.prepareStatement(sql);			 
			 preparedStatement.setString(1, pessoa.getNome());		
			 preparedStatement.setString(2, pessoa.getSexo());		
			 preparedStatement.setString(3, pessoa.getCpf());
			 preparedStatement.setString(4, pessoa.getRg());
			 preparedStatement.setInt(5, pessoa.getEndereco().getCodigo());			
			 linhas = preparedStatement.executeUpdate();
			 conexao.commit();				
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();

		}
		return linhas;	
	}
	
	public List<Pessoa> lista() {

		try {
			 String sql = "SELECT p."+ID+ ", p."+NOME+", p."+SEXO+", p."+CPF+", p."+RG+", p."+ID_ENDERECO+
             " FROM pessoa p JOIN endereco e ON p.id_endereco = e.codigo";   

			preparedStatement = conexao.prepareStatement(sql);
			ResultSet resultado = preparedStatement.executeQuery();
			lista = new ArrayList<Pessoa>();

			while (resultado.next()) {

				Pessoa pessoa = new Pessoa();
				pessoa.setCodigo(resultado.getInt(ID));
				pessoa.setNome(resultado.getString(NOME));
				pessoa.setCpf(resultado.getString(CPF));
				pessoa.setRg(resultado.getString(RG));
				pessoa.setSexo(resultado.getString(SEXO));

				Endereco endereco = new Endereco();
				endereco.setCodigo(resultado.getInt(ID_ENDERECO));
				pessoa.setEndereco(endereco);
				lista.add(pessoa);
			}
			return lista;

		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return null;

	}
	
	public Pessoa pesquisar(Pessoa p) {
		try {
			
			String sql = "SELECT p." + ID + ", p." + NOME + ", p." + SEXO
					+ ", p." + CPF + ", p." + RG + ", p." + ID_ENDERECO
					+ " FROM pessoa p  where p.cpf = ? or p.rg = ?";

			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setString(1, p.getCpf());
			preparedStatement.setString(2, p.getRg());
			ResultSet resultado = preparedStatement.executeQuery();

			Pessoa pessoa = new Pessoa();
			String rua = null;
			while (resultado.next()) {
				pessoa.setCodigo(resultado.getInt(ID));
				pessoa.setNome(resultado.getString(NOME));
				pessoa.setCpf(resultado.getString(CPF));
				pessoa.setRg(resultado.getString(RG));
				pessoa.setSexo(resultado.getString(SEXO));
				rua = resultado.getString(ID_ENDERECO);
			}
			ControleEndereco controleEndereco = new ControleEndereco();
			Endereco endereco = controleEndereco.pesquisar(rua);
			pessoa.setEndereco(endereco);

			return pessoa;
		} catch (SQLException exception) {
			exception.printStackTrace();
		}
		return null;
	}
	
	public int alterar(Pessoa pessoa) {
		try {
			String sql = "UPDATE pessoa SET nome = ?,  sexo = ?, rg = ? WHERE cpf = ? or rg = ? ";
			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setString(1, pessoa.getNome());
			preparedStatement.setString(2, pessoa.getSexo());
			preparedStatement.setString(3, pessoa.getRg());
			preparedStatement.setString(4, pessoa.getCpf());
			preparedStatement.setString(5, pessoa.getRg());
			linhas = preparedStatement.executeUpdate();
			conexao.commit();
			return linhas;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return 0;
	}

	
	public Pessoa pesquisar(int codigo) {
		try {
			
			String sql = "SELECT p." + ID + ", p." + NOME + ", p." + SEXO
					+ ", p." + CPF + ", p." + RG + ", p." + ID_ENDERECO
					+ " FROM pessoa p  where p.codigo = ?";

			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setInt(1, codigo);
			ResultSet resultado = preparedStatement.executeQuery();
			Pessoa pessoa = new Pessoa();

			while (resultado.next()) {
				pessoa.setCodigo(resultado.getInt(ID));
				pessoa.setNome(resultado.getString(NOME));
				pessoa.setCpf(resultado.getString(CPF));
				pessoa.setRg(resultado.getString(RG));
				pessoa.setSexo(resultado.getString(SEXO));

				ControleEndereco controleEndereco = new ControleEndereco();
				Endereco endereco = controleEndereco.pesquisar(resultado.getString(ID_ENDERECO));
				pessoa.setEndereco(endereco);
			}
			return pessoa;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return null;
	}
	
	public int deletar(Pessoa pessoa) {
		try {
			System.out.println("Deletando pessoa, Codigo:" + pessoa.getCpf());
			String sql = "delete from pessoa where cpf = ?";
			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setString(1, pessoa.getCpf());
			linhas = preparedStatement.executeUpdate();
			conexao.commit();
			return linhas;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return 0;
	}

}